#include "app_message.h"

/**
 * 将字符数组格式的消息数据转换为json格式的消息数据
    消息数据包含
        连接类型：1 代表蓝牙连接
        设备id: "xx"
        消息体内容: "abcd"
    字符数组格式： 1 2 4 xxabcd
        字节1：连接类型
        字节2：设备id长度
        字节3：消息体长度
        字节4~n：设备id和消息体
    json格式: {"conn_type": 1, "id": "5858", "msg": "61626364"}
 */

char *app_message_charsToJson(char *chars, int chars_len)
{
    int conn_type = chars[0]; // 连接类型
    int id_len = chars[1];    // 设备id长度
    int msg_len = chars[2];   // 消息体长度
    // 创建一个JSON对象
    cJSON *root = cJSON_CreateObject();
    // 将conn_type添加到JSON对象中
    cJSON_AddNumberToObject(root, "conn_type", conn_type);

    // 定义两个字符数组，用于存储id和msg 
    char id[id_len];
    char msg[msg_len];

    // 将chars数组中的数据复制到数组中
    memcpy(id, chars + 3, id_len);
    memcpy(msg, chars + 3 + id_len, msg_len);

    // 将id和msg转换为16进制字符串
    char *id_hex = app_common_charsToHexstr(id, id_len);
    char *msg_hex = app_common_charsToHexstr(msg, msg_len);

    // 将id添加到JSON对象中
    cJSON_AddStringToObject(root, "id", id_hex);
    // 将msg添加到JSON对象中
    cJSON_AddStringToObject(root, "msg", msg_hex);

    // 将JSON对象转换为字符串
    char *json = cJSON_PrintUnformatted(root);

    // 释放id_hex和msg_hex
    free(id_hex);
    free(msg_hex);

    // 释放JSON对象
    cJSON_Delete(root);

    return json;
}

int app_message_jsonToChars(char *json, char *chars_buff, int buff_len)
{
    // 解析JSON字符串
    cJSON *root = cJSON_Parse(json);
    // 检查JSON对象是否解析成功
    if (root == NULL)
    {
        return -1;
    }
    // 获取JSON对象中的conn_type值
    chars_buff[0] = cJSON_GetObjectItem(root, "conn_type")->valueint;

    // 获取JSON对象中的id值
    char *id = cJSON_GetObjectItem(root, "id")->valuestring;
    // 获取JSON对象中的msg值
    char *msg = cJSON_GetObjectItem(root, "msg")->valuestring;
    // 获取id、msg的十六进制字符串长度
    int id_len = strlen(id);
    int msg_len = strlen(msg);

    // 将id转换为字符串
    char *id_hex = app_common_hexstrToChars(id, &id_len);
    // 将msg转换为字符串
    char *msg_hex = app_common_hexstrToChars(msg, &msg_len);

    // 将id、msg的实际长度存入chars数组中
    chars_buff[1] = id_len;
    chars_buff[2] = msg_len;

    // 计算消息长度
    int len = 3 + id_len + msg_len;
    // 如果消息长度大于缓冲区长度，则返回-1
    if (len > buff_len)
    {
        return -1;
    }

    // 将id_hex和msg_hex复制到chars数组中
    memcpy(chars_buff + 3, id_hex, id_len);
    memcpy(chars_buff + 3 + id_len, msg_hex, msg_len);

    // 释放id_hex和msg_hex
    free(id_hex);
    free(msg_hex);
    // 释放JSON对象
    cJSON_Delete(root);

    return len;
}